using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using Jogos;

namespace ex1_bola
{
    class Bola
    {
        //private const float VELOCIDADE_MINIMA = 1.0f;
        //private const float VELOCIDADE_MAXIMA = 15.0f;

        //em pixeis por segundo
        private const float VELOCIDADE_MINIMA = 80.0f;
        private const float VELOCIDADE_MAXIMA = 280.0f;

        private const float ESCALA_MINIMA = 0.2f;
        private const float ESCALA_MAXIMA = 2.5f;

        private float escala;

        public static Texture2D imagem = null;

        private Vector2 posicao;
        private Vector2 velocidade;
        private Vector2 limite;
        private Color cor;
        
        //animated ball's constructor
        internal Bola()
        {
            escala =(float) GeradorAleatorio.GeraFloat(ESCALA_MINIMA, ESCALA_MAXIMA);

            limite = new Vector2(GameBola.AreaJogo.X - imagem.Width*escala, GameBola.AreaJogo.Y - imagem.Height*escala);

            //gerando os valores aleatroriamente
            //r.posicao = new Vector2(x, y);

            //codigo menos otimizado - a reutilizacao deste codigo pode induzir a erro 
            //int x = GameBola.r.Next((int) limite.X);
            //int y = GameBola.r.Next((int) limite.Y);

            int x =GeradorAleatorio.GeraInt(0, (int)limite.X);
            int y =GeradorAleatorio.GeraInt(0, (int)limite.Y);

            //codigo menos otimizado - a reutilizacao deste codigo pode induzir a erro 
            //float velocidadeX = VELOCIDADE_MINIMA + (VELOCIDADE_MAXIMA-VELOCIDADE_MINIMA)* (float) GameBola.r.NextDouble();
            //float velocidadeY = VELOCIDADE_MINIMA + (VELOCIDADE_MAXIMA-VELOCIDADE_MINIMA)* (float) GameBola.r.NextDouble();

            //nova versao, codigo mais otimizado - usa a classse GeradorAleatorio
            float velocidadeX = (float) GeradorAleatorio.GeraFloat(VELOCIDADE_MINIMA, VELOCIDADE_MAXIMA);
            float velocidadeY = (float) GeradorAleatorio.GeraFloat(VELOCIDADE_MINIMA, VELOCIDADE_MAXIMA);

            velocidade = new Vector2(velocidadeX, velocidadeY);

            //tirar o parametro do construtor e declarar a cor da bola com a classe GeradorAleatorio para gerar cores claras automaticamente
            //cor = corBola;
            //cor = GeradorAleatorio.GeraCorClara();
            //cores fixas de um array
            cor = GeradorAleatorio.GeraCor(
                new Color[]{
                    Color.Tomato,
                    Color.Orange,
                    Color.OrangeRed,
                    Color.Red,
                    Color.Yellow
                    } 
                ); 
        }

        internal void Draw(SpriteBatch spriteBatch, Microsoft.Xna.Framework.GameTime gameTime)
        {
            spriteBatch.Draw(imagem, posicao, cor);
        }

        internal void Update(GameTime gameTime)
        {
            //posicao.X += velocidade.X;
            //posicao.Y += velocidade.Y;
            
            //passar a nossa velocidade para pixeis por segundo - a vantagem e' a velocidade das bolas ser igual em todos os dispositivos e haver uma melhor gestao da memoria nos dispositivos (quer tenham um processador mais fracco ou mais potente)
            posicao.X += (float)(velocidade.X * gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f);
            posicao.Y += (float)(velocidade.Y * gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f);

            if (posicao.X < 0)
            {
                if (velocidade.X < 0) velocidade.X *= -1;
            }
            else if (posicao.X > limite.X)
            {
                if (velocidade.X > 0) velocidade.X *= -1;
            }

            if (posicao.Y < 0)
            {
                if (velocidade.Y < 0) velocidade.Y *= -1;
            }
            else if (posicao.Y >= limite.Y)
            {
                if (velocidade.Y > 0) velocidade.Y *= -1;
            }  
        }

        //metodo para 'matar' a bola
        internal bool Acertou(Vector2 posClique)
        {
            /*
            //cria um rectangulo
            Rectangle r = new Rectangle((int)posicao.X, (int)posicao.Y, imagem.Width, imagem.Height);
            //cria um ponto
            Point pontoClique = new Point((int)posClique.X, (int)posClique.Y);
            //bool porque se o clique for na area do rectagulo entao e' true, 'mata' a bola, se nao for e' falsa, nao 'mata' a bola

            return r.Contains(pontoClique);
            */

            //float centroX = posicao.X + imagem.Width / 2.0f;
            //float centroY = posicao.Y + imagem.Height / 2.0f;
            
            //melhor, criamos uma variavel 'raio'
            float raio = imagem.Width / 2.0f;

            float centroX = posicao.X + raio;
            float centroY = posicao.Y + raio;

            float dx = posClique.X - centroX;
            float dy = posClique.Y - centroY;

            //distancia euclidiana - distancia em linha reta (mais curta) entre dois pontos
            float dist = (float) Math.Sqrt(dx * dx + dy * dy);

            return (dist <= raio);
        }

        //public Color corBola { get; set; }
    }
}
